from src.utils import response_
from flask import Blueprint, current_app as app
import sys
import traceback

error_bp = Blueprint('errors', __name__)


@error_bp.app_errorhandler(404)
def not_found(error):
    return response_.error(message="资源不存在", code=404)


# @error_bp.app_errorhandler(Exception)
# def global_error(error):
#     # 日志记录操作...
#     app.logger.error(f"Unhandled Exception: {str(error)}")
#     return response_.error(message="服务器内部错误", code=500)


@error_bp.app_errorhandler(Exception)
def handle_exception(e):
    # 获取异常信息和堆栈
    exc_type, exc_value, exc_traceback = sys.exc_info()
    # 使用traceback提取堆栈信息
    # 这里我们获取整个堆栈，最后一行就是错误最初发生的位置
    stack = traceback.extract_tb(exc_traceback)
    # 堆栈中最后一个元素是异常发生的具体位置
    if stack:
        last_call = stack[-1]
        file_name, line, func_name, text = last_call
        # 记录原始错误位置
        app.logger.error(f"Error occurred at: {file_name}:{line} in {func_name}(): {text}")
    else:
        app.logger.error("Error occurred, but no stack trace available")

    # 记录完整的堆栈信息
    app.logger.exception(e)

    # 返回错误响应
    return response_.error(message=str(e), code=500)

